/*
路由级权限控制思路：
    1、准备工作：提前编写过滤路由的函数
    2、准备工作：将固定路由和业务路由分开管理，可以单独新建文件夹，也可以在一个文件之下单独建一个模块，将固定路由设置为默认所有用户都可以访问的路由，给业务路由添加权限标识。
    3、在登录成功并且保存token及userinfo之后，跳转首页之前，调用过滤路由的函数，过滤出用户有权限访问的业务路由。
    4、将过滤出来的路由，用forEach进行遍历，并使用 addRoute 动态添加到router中
    5、正常访问路由


按钮级权限控制思路：
    1、准备工作，提前编写判断按钮权限的函数
    2、准备工作，提前给按钮添加权限标识
    3、在组件中准备渲染按钮时调用判断按钮权限的函数，判断用户是否有权限访问该按钮，如果有权限则渲染出该按钮，否则不渲染。
    4、正常访问按钮

    判断按钮权限的函数demo：
    funcation hasAuth (permission,permissions){
        // 判断是否有访问该路由的权限，结果是true/false 
        return permissions.includes(permission)
    }
*/


// hasPermission()功能：拿到一个路由和用户的权限列表，判断这个路由是否在用户的权限列表中，最终返回 true（表示有访问权限） 或者 false（表示没有访问权限）
// 参数一：route 路由
// 参数二：permissions 用户的权限列表
function hasPermission(route,permissions){
// 需要权限才能访问
    if(route.meta && route.meta.permission){
        // 判断是否有访问该路由的权限，结果是true 或者 false
        return permissions.includes(route.meta.permission)
    }else{//不需要权限就可以访问
        return true
    }
    
}


// filterRoutes()函数的功能：先拿到业务路由表，再拿到用户的权限列表，然后根据用户权限列表从业务路由表中过滤出用户有权限访问的路由
// routes 业务路由表 例如[{路由1},{路由2}]
// permissions 用户权限列表 [1,11,12,13,14,2]  []中写的是用数字或者字符串代表的路由表
export function filterRoutes(routes,permissions){
    var accessRoutes = []
    //过滤这个路由表
   accessRoutes = routes.filter((route)=>{
        // 判断 如果route表示的路由规则在用户的权限列表中，则用户有权限访问该路由，该路由就需要过滤出来
        if(hasPermission(route,permissions)){
            // 如果route这个路由有子路由表，则继续过滤子路由表
            if(route.children && route.children.length){  // 继续过滤子路由(递归调用)
            route.children = filterRoutes(route.children,permissions)
            }return true    
        }else{
            return false 
        }
    })
    // 返回最终过滤出来的  用户有权限访问的路由
    return accessRoutes
}